home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / python2.4 / pty.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2005-10-18  |  5KB  |  199 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.4)
  3.  
  4. '''Pseudo terminal utilities.'''
  5. from select import select
  6. import os
  7. import tty
  8. __all__ = [
  9.     'openpty',
  10.     'fork',
  11.     'spawn']
  12. STDIN_FILENO = 0
  13. STDOUT_FILENO = 1
  14. STDERR_FILENO = 2
  15. CHILD = 0
  16.  
  17. def openpty():
  18.     '''openpty() -> (master_fd, slave_fd)
  19.     Open a pty master/slave pair, using os.openpty() if possible.'''
  20.     
  21.     try:
  22.         return os.openpty()
  23.     except (AttributeError, OSError):
  24.         pass
  25.  
  26.     (master_fd, slave_name) = _open_terminal()
  27.     slave_fd = slave_open(slave_name)
  28.     return (master_fd, slave_fd)
  29.  
  30.  
  31. def master_open():
  32.     '''master_open() -> (master_fd, slave_name)
  33.     Open a pty master and return the fd, and the filename of the slave end.
  34.     Deprecated, use openpty() instead.'''
  35.     
  36.     try:
  37.         (master_fd, slave_fd) = os.openpty()
  38.     except (AttributeError, OSError):
  39.         pass
  40.  
  41.     slave_name = os.ttyname(slave_fd)
  42.     os.close(slave_fd)
  43.     return (master_fd, slave_name)
  44.     return _open_terminal()
  45.  
  46.  
  47. def _open_terminal():
  48.     '''Open pty master and return (master_fd, tty_name).
  49.     SGI and generic BSD version, for when openpty() fails.'''
  50.     
  51.     try:
  52.         import sgi as sgi
  53.     except ImportError:
  54.         pass
  55.  
  56.     
  57.     try:
  58.         (tty_name, master_fd) = sgi._getpty(os.O_RDWR, 438, 0)
  59.     except IOError:
  60.         msg = None
  61.         raise os.error, msg
  62.  
  63.     return (master_fd, tty_name)
  64.     for x in 'pqrstuvwxyzPQRST':
  65.         for y in '0123456789abcdef':
  66.             pty_name = '/dev/pty' + x + y
  67.             
  68.             try:
  69.                 fd = os.open(pty_name, os.O_RDWR)
  70.             except os.error:
  71.                 continue
  72.  
  73.             return (fd, '/dev/tty' + x + y)
  74.         
  75.     
  76.     raise os.error, 'out of pty devices'
  77.  
  78.  
  79. def slave_open(tty_name):
  80.     '''slave_open(tty_name) -> slave_fd
  81.     Open the pty slave and acquire the controlling terminal, returning
  82.     opened filedescriptor.
  83.     Deprecated, use openpty() instead.'''
  84.     result = os.open(tty_name, os.O_RDWR)
  85.     
  86.     try:
  87.         ioctl = ioctl
  88.         I_PUSH = I_PUSH
  89.         import fcntl
  90.     except ImportError:
  91.         return result
  92.  
  93.     
  94.     try:
  95.         ioctl(result, I_PUSH, 'ptem')
  96.         ioctl(result, I_PUSH, 'ldterm')
  97.     except IOError:
  98.         pass
  99.  
  100.     return result
  101.  
  102.  
  103. def fork():
  104.     '''fork() -> (pid, master_fd)
  105.     Fork and make the child a session leader with a controlling terminal.'''
  106.     
  107.     try:
  108.         (pid, fd) = os.forkpty()
  109.     except (AttributeError, OSError):
  110.         pass
  111.  
  112.     if pid == CHILD:
  113.         
  114.         try:
  115.             os.setsid()
  116.         except OSError:
  117.             pass
  118.         except:
  119.             None<EXCEPTION MATCH>OSError
  120.         
  121.  
  122.     None<EXCEPTION MATCH>OSError
  123.     return (pid, fd)
  124.     (master_fd, slave_fd) = openpty()
  125.     pid = os.fork()
  126.     if pid == CHILD:
  127.         os.setsid()
  128.         os.close(master_fd)
  129.         os.dup2(slave_fd, STDIN_FILENO)
  130.         os.dup2(slave_fd, STDOUT_FILENO)
  131.         os.dup2(slave_fd, STDERR_FILENO)
  132.         if slave_fd > STDERR_FILENO:
  133.             os.close(slave_fd)
  134.         
  135.     
  136.     return (pid, master_fd)
  137.  
  138.  
  139. def _writen(fd, data):
  140.     '''Write all the data to a descriptor.'''
  141.     while data != '':
  142.         n = os.write(fd, data)
  143.         data = data[n:]
  144.  
  145.  
  146. def _read(fd):
  147.     '''Default read function.'''
  148.     return os.read(fd, 1024)
  149.  
  150.  
  151. def _copy(master_fd, master_read = _read, stdin_read = _read):
  152.     '''Parent copy loop.
  153.     Copies
  154.             pty master -> standard output   (master_read)
  155.             standard input -> pty master    (stdin_read)'''
  156.     while None:
  157.         (rfds, wfds, xfds) = select([
  158.             master_fd,
  159.             STDIN_FILENO], [], [])
  160.         if master_fd in rfds:
  161.             data = master_read(master_fd)
  162.             os.write(STDOUT_FILENO, data)
  163.         
  164.         if STDIN_FILENO in rfds:
  165.             data = stdin_read(STDIN_FILENO)
  166.             _writen(master_fd, data)
  167.             continue
  168.  
  169.  
  170. def spawn(argv, master_read = _read, stdin_read = _read):
  171.     '''Create a spawned process.'''
  172.     if type(argv) == type(''):
  173.         argv = (argv,)
  174.     
  175.     (pid, master_fd) = fork()
  176.     if pid == CHILD:
  177.         os.execlp(argv[0], *argv)
  178.     
  179.     
  180.     try:
  181.         mode = tty.tcgetattr(STDIN_FILENO)
  182.         tty.setraw(STDIN_FILENO)
  183.         restore = 1
  184.     except tty.error:
  185.         restore = 0
  186.  
  187.     
  188.     try:
  189.         _copy(master_fd, master_read, stdin_read)
  190.     except (IOError, OSError):
  191.         if restore:
  192.             tty.tcsetattr(STDIN_FILENO, tty.TCSAFLUSH, mode)
  193.         
  194.     except:
  195.         restore
  196.  
  197.     os.close(master_fd)
  198.  
  199.